#ifndef NATIVE_SYSTEM_BASE_ARRAYCURSOR_H
#define NATIVE_SYSTEM_BASE_ARRAYCURSOR_H

#ifndef NATIVE_SYSTEM_BASE_OBJECT_H
#include "System/Base/Object.h"
#endif
#ifndef NATIVE_SYSTEM_BASE_EQUALTO_H
#include "System/Base/EqualTo.h"
#endif
#ifndef NATIVE_SYSTEM_BASE_CURSORIAL_H
#include "System/Base/Cursorial.h"
#endif

namespace Native { namespace System
{
    //****************************************************************************************************************//
    //CArrayCursor
    //
    //****************************************************************************************************************//
    NATIVE_DECLARE_CONST_OBJECT(CArrayCursor, ARRAY_CURSOR);
    class NATIVE_LIBRARY_EXPORT CArrayCursor :
        public CObject,
        public ICursorial,
        public IEqualTo<CArrayCursor>
    {
        NATIVE_DECLARE_OBJECT;

        NATIVE_DECLARE_PROPERTY(public, public, size_t, Index, _index);

    public:
        static const size_t INEXISTENT = -1;

    public:
        CArrayCursor();
        CArrayCursor(ARRAY_CURSOR& that);
        CArrayCursor(ARRAY_CURSOR&& that);
        CArrayCursor(size_t index);
        //IEqualTo
        virtual bool operator==(ARRAY_CURSOR& rvalue) const;
        virtual bool operator!=(ARRAY_CURSOR& rvalue) const;
        //ICursorial
        virtual bool Exist() const;
        virtual bool Forward();
        virtual bool Back();

        ARRAY_CURSOR& operator=(ARRAY_CURSOR& rvalue);
    };
}}

#endif